# -*- coding: utf-8 -*-

"""剑指 Offer II 038. 每日温度
请根据每日 气温 列表 temperatures ，重新生成一个列表，要求其对应位置的输出为：要想观测到更高的气温，至少需要等待的天数。如果气温在这之后都不会升高，请在该位置用 0 来代替。

示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]

提示：
1 <= temperatures.length <= 10^5
30 <= temperatures[i] <= 100"""


# from queue import Empty, LifoQueue

# class T():
#     def __init__(self, day, t):
#         self.day = day
#         self.t = t


class Solution:
    """本题在尝试温差前缀和时，发现存在负数无法使用二分查找，尝试双指针法时，右指针存在前移的可能；
    若使用遍历挨个查询，数组长度在10万级，可能提交后，时间复杂度较高，不会通过；
    灵光乍现，考虑前面几个题都是用的栈来解决问题，那么本题尝试用栈呢？
    如果后一个温度大于前一个温度，则计算两者间隔天数，前一个温度记录拿到答案可以消解归档，用后一个温度继续消解栈里的温度记录
    如果后一个温度不大于前一个温度，则将两个温度相继入栈，继续前行
    
    为了方便记录答案，可以先创建答案数组，各位置为0
    
    第一次，用 LifoQueue 作栈，自定义温度 T 类型，并且在消解过程中采用递归，提交超时,经测试,为栈结构,T类型,递归三种因素造成
    第二次，利用数组作栈,弃用 T 类型，改递归为循环，提交成功; 若继续用递归, 虽也提交成功,但是时间是循环的2倍,空间占用为3倍"""
    def dailyTemperatures(self, temperatures):
        hoters = [0 for _ in range(len(temperatures))]

        # stack = LifoQueue()

        stack = []
        for day, temper in zip(range(len(temperatures)), temperatures):
            while True:
                if stack and temperatures[stack[-1]] < temper:
                    last_day = stack.pop()
                    hoters[last_day] = day-last_day
                else:
                    break
            stack.append(day)
        
        # def ask(day, t):
        #     if stack and temperatures[stack[-1]] < t:
        #         last_day = stack.pop()
        #         hoters[last_day] = day-last_day
        #         ask(day, t)
        #     else:
        #         stack.append(day)

        # for day, temper in zip(range(len(temperatures)), temperatures):
        #     ask(day, temper)
        
        return hoters


if __name__ == '__main__':
    so = Solution()
    print(so.dailyTemperatures([73,74,75,71,69,72,76,73]))
    print(so.dailyTemperatures([30,40,50,60]))
    print(so.dailyTemperatures([30,60,90]))
